package 康复训练_JavaGo并驾齐驱;

public class Jz11旋转数组的最小数字 {

    /**
     * 把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
     * 给你一个可能存在 重复 元素值的数组 numbers ，它原来是一个升序排列的数组，并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如，数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转，该数组的最小值为 1。  
     * 注意，数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
     */

    // 切记 right-- 就可以了
    public int minArray(int[] numbers) {

        // 二分查找, 查找的过程发现不对了, 那么就去不对的那一边继续二分查找

        int left = 0;
        int right = numbers.length - 1;

        while (left <= right) {
            int rightNum = numbers[right];
            int midIndex = (right - left) / 2 + left;
            int num = numbers[midIndex];
            if (rightNum > num) {
                right = midIndex;
            } else if (rightNum < num){
                left = midIndex + 1;
            } else {
                // 相等就缩小右边
                right--;
            }
        }

        return numbers[left];
    }

    public static void main(String[] args) {
        Jz11旋转数组的最小数字 n = new Jz11旋转数组的最小数字();
        int[] arr = {3,4,5,1,2};
        int result = n.minArray(arr);
        System.out.println(result);
    }

}
